﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EntitiesLayer;
using System.Collections;
using System.Transactions;
using System.Data.SqlClient;
using System.Data;
using DAL.Repositories;
using DAL;

namespace DAL.Repositories
{

    public class EjercicioRepository : IRepository<Ejercicio>
    {

        private List<IEntity> _insertItems;
        private List<IEntity> _updateItems;
        private List<IEntity> _deleteItems;
        public EjercicioRepository()
        {
            _insertItems = new List<IEntity>();
            _updateItems = new List<IEntity>();
            _updateItems = new List < IEntity>();
        }

        public void Insert(Ejercicio entity)
        {
            _insertItems.Add(entity);
        }

        public void Update(Ejercicio entity)
        {
            _updateItems.Add(entity);
        }

        public void Delete(Ejercicio entity)
        {
            _deleteItems.Add(entity);
        }
        public IEnumerable<Musculo> GetMusculosAsociados(int pidEjercicio)
        {

            List<Musculo> listaMusculos = null;

            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.Add(new SqlParameter("@idEjercicio", pidEjercicio));
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_listar_MusculosAsociadosAEjercicios");

            if (ds.Tables[0].Rows.Count > 0)
            {
                listaMusculos = new List<Musculo>();

                foreach (DataRow dr1 in ds.Tables[0].Rows)
                {

                    listaMusculos.Add(new Musculo
                    {
                        Id = Convert.ToInt32(dr1["id"]),
                        Nombre = dr1["nombre"].ToString(),
                        Origen = dr1["origen"].ToString(),
                        Irrigacion = dr1["irrigacion"].ToString(),
                        Insercion = dr1["insercion"].ToString(),
                        Inervacion = dr1["inervacion"].ToString(),

                    });



                }


            }

            return listaMusculos;

        }

        public IEnumerable<Ejercicio> GetAll()
        {


            List<Ejercicio> listaEjercicios = null;


            SqlCommand cmd = new SqlCommand();
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_listar_Ejercicios");

            if (ds.Tables[0].Rows.Count > 0)
            {
                listaEjercicios = new List<Ejercicio>();

                foreach (DataRow dr in ds.Tables[0].Rows)
                {


                    listaEjercicios.Add(new Ejercicio
                    {
                        Id = Convert.ToInt32(dr["id"]),
                        NombreComun = dr["nombre_comun"].ToString(),
                        NombreOpcional = dr["nombre_opcional"].ToString(),
                        Codigo = dr["codigo"].ToString(),
                        //PosicionFinal = (byte[])dr["posicion_final"],
                        //PosicionInicial = (byte[])dr["posicion_inicial"],
                        MusculoPrincipal = dr["musculo_principal"].ToString(),
                        ErroresComunes = dr["errores_comunes"].ToString(),
                        IndicacionesGenerales = dr["indicaciones_generales"].ToString(),

                    });
                }
            }

            return listaEjercicios;
        }

        public IEnumerable<Ejercicio> FiltrarListaEjercicios(String ptextoAfiltrar)
        {
            List<Ejercicio> listaEjercicios = null;

            SqlCommand cmd = new SqlCommand();

            cmd.Parameters.Add(new SqlParameter("@textoAfiltrar", ptextoAfiltrar));
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_filtrar_Ejercicios");

            if (ds.Tables[0].Rows.Count > 0)
            {
                listaEjercicios = new List<Ejercicio>();

                foreach (DataRow dr in ds.Tables[0].Rows)
                {

                    listaEjercicios.Add(new Ejercicio
                    {
                        Id = Convert.ToInt32(dr["id"]),
                        NombreComun = dr["nombre_comun"].ToString(),
                        NombreOpcional = dr["nombre_opcional"].ToString(),
                        Codigo = dr["codigo"].ToString(),
                        PosicionFinal = (byte[])dr["posicion_final"],
                        PosicionInicial = (byte[])dr["posicion_inicial"],
                        MusculoPrincipal = dr["musculo_principal"].ToString(),
                        ErroresComunes = dr["errores_comunes"].ToString(),
                        IndicacionesGenerales = dr["indicaciones_generales"].ToString()

                    });
                }
            }

            return listaEjercicios;
        }


        public Ejercicio GetById(int id)
        {
            Ejercicio objEjercicio = null;
            var sqlQuery = "SELECT id, nombre_comun, nombre_opcional,codigo,errores_comunes,indicaciones_generales, musculo_principal, posicion_inicial, posicion_final FROM Ejercicios WHERE id = @id";
            SqlCommand cmd = new SqlCommand(sqlQuery);
            cmd.Parameters.AddWithValue("@id", id);

            var ds = DBAccess.ExecuteQuery(cmd);

            if (ds.Tables[0].Rows.Count > 0)
            {
                var dr = ds.Tables[0].Rows[0];

                objEjercicio = new Ejercicio
                {

                    Id = Convert.ToInt32(dr["id"]),
                    NombreComun = dr["nombre_comun"].ToString(),
                    NombreOpcional = dr["nombre_opcional"].ToString(),
                    Codigo = dr["codigo"].ToString(),
                    PosicionFinal = (byte[])dr["posicion_final"],
                    PosicionInicial = (byte[])dr["posicion_inicial"],
                    MusculoPrincipal = dr["musculo_principal"].ToString(),
                    ErroresComunes = dr["errores_comunes"].ToString(),
                    IndicacionesGenerales = dr["indicaciones_generales"].ToString()

                };
            }



            return objEjercicio;
        }


        public void Save()
        {
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    if (_insertItems.Count > 0)
                    {
                        foreach (Ejercicio objEjercicio in _insertItems)
                        {
                            InsertEjercicio(objEjercicio);
                        }
                    }

                    if (_updateItems.Count > 0)
                    {
                        foreach (Ejercicio p in _updateItems)
                        {
                            UpdateEjercicio(p);
                        }
                    }


                    scope.Complete();
                }
                catch (TransactionAbortedException ex)
                {

                }
                catch (ApplicationException ex)
                {

                }
                finally
                {
                    Clear();
                }

            }
        }

        public void Clear()
        {
            _insertItems.Clear();
            _updateItems.Clear();
        }

        private void InsertEjercicio(Ejercicio objEjercicio)
        {

            try
            {
                SqlCommand cmd1 = new SqlCommand();
                SqlCommand cmd2 = new SqlCommand();

                cmd1.Parameters.Add(new SqlParameter("@nombreComun", objEjercicio.NombreComun));
                cmd1.Parameters.Add(new SqlParameter("@nombreOpcional", objEjercicio.NombreOpcional));
                cmd1.Parameters.Add(new SqlParameter("@codigo", objEjercicio.Codigo));
                cmd1.Parameters.Add(new SqlParameter("@imagenInicial", objEjercicio.PosicionInicial));
                cmd1.Parameters.Add(new SqlParameter("@imagenFinal", objEjercicio.PosicionFinal));
                cmd1.Parameters.Add(new SqlParameter("@musculoPrincipal", objEjercicio.MusculoPrincipal));
                cmd1.Parameters.Add(new SqlParameter("@erroresComunes", objEjercicio.ErroresComunes));
                cmd1.Parameters.Add(new SqlParameter("@indicacionesGenerales", objEjercicio.IndicacionesGenerales));


                DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd1, "pa_agregar_ejercicio");

                foreach (Musculo objMusculo in objEjercicio.ListaMusculos)
                {
                    cmd2.Parameters.Add(new SqlParameter("@idMusculo", objMusculo.Id));
                    DataSet ds1 = DBAccess.ExecuteSPWithDS(ref cmd2, "pa_asociar_musculos");
                    cmd2.Parameters.Clear();
                }



            }
            catch (Exception ex)
            {

            }

        }


        private void UpdateEjercicio(Ejercicio objEjercicio)
        {
            try
            {
                SqlCommand cmd1 = new SqlCommand();
                SqlCommand cmd2 = new SqlCommand();

                cmd1.Parameters.Add(new SqlParameter("@idEjercicio", objEjercicio.Id));
                cmd1.Parameters.Add(new SqlParameter("@nombreComun", objEjercicio.NombreComun));
                cmd1.Parameters.Add(new SqlParameter("@nombreOpcional", objEjercicio.NombreOpcional));
                cmd1.Parameters.Add(new SqlParameter("@codigo", objEjercicio.Codigo));
                cmd1.Parameters.Add(new SqlParameter("@imagenInicial", objEjercicio.PosicionInicial));
                cmd1.Parameters.Add(new SqlParameter("@imagenFinal", objEjercicio.PosicionFinal));
                cmd1.Parameters.Add(new SqlParameter("@musculoPrincipal", objEjercicio.MusculoPrincipal));
                cmd1.Parameters.Add(new SqlParameter("@erroresComunes", objEjercicio.ErroresComunes));
                cmd1.Parameters.Add(new SqlParameter("@indicacionesGenerales", objEjercicio.IndicacionesGenerales));


                DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd1, "pa_modificar_ejercicio");

                foreach (Musculo objMusculo in objEjercicio.ListaMusculos)
                {
                    cmd2.Parameters.Add(new SqlParameter("@idMusculo", objMusculo.Id));
                    cmd2.Parameters.Add(new SqlParameter("@idEjercicio", objEjercicio.Id));
                    DataSet ds1 = DBAccess.ExecuteSPWithDS(ref cmd2, "pa_modificar_asociar_musculos");
                    cmd2.Parameters.Clear();
                }


            }
            catch (Exception ex)
            {

            }
        }



    }
}
